Cross Product/DNS - Check Unhealthy records/Get-AzDNSUnhealthyRecords.ps1 (124 lines of code) (raw):
<#
1. Install Pre requisites Az PowerShell modules (https://docs.microsoft.com/en-us/powershell/azure/install-az-ps?view=azps-5.7.0)
2. From PowerShell prompt navigate to folder where the script is saved and run the following command
.\ Get-AzDNSUnhealthyRecords.ps1 -SubscriptionId <subscription id> -ZoneName <zonename>
Replace subscription id with subscription id of interest.
ZoneName with actual zone name.
#>
param(
# subscription if to fetch dns records from
[String]$SubscriptionId = "All",
#filtering zone name
[String]$ZoneName = "All"
)
if ($SubscriptionId -eq "All") {
Write-Host -ForegroundColor Yellow "No subscription Id passed will process all subscriptions"
}
if ($ZoneName -eq "All") {
Write-Host -ForegroundColor Yellow "No Zone name passed will process all zones in subscription"
}
$ErrorActionPreference = "Stop"
$AZModules = @('Az.Accounts', 'Az.Dns')
$AzLibrariesLoadStart = Get-Date
$progressItr = 1;
$ProgessActivity = "Loading required Modules";
$StoreWarningPreference = $WarningPreference
$WarningPreference = 'SilentlyContinue'
Foreach ($module in $AZModules) {
$progressValue = $progressItr / $AZModules.Length
Write-Progress -Activity $ProgessActivity -Status "$module $($progressValue.ToString('P')) Complete:" -PercentComplete ($progressValue * 100)
If (Get-Module -Name $module) {
continue
}
elseif (Get-Module -ListAvailable -Name $module) {
Import-Module -name $module -Scope Local -Force
}
else {
Install-module -name $module -AllowClobber -Force -Scope CurrentUser
Import-Module -name $module -Scope Local -Force
}
$progressItr = $progressItr + 1;
If (!$(Get-Module -Name $module)) {
Write-Error "Could not load dependant module: $module"
throw
}
}
$WarningPreference = $StoreWarningPreference
Write-Progress -Activity $ProgessActivity -Completed
$context = Get-AzContext;
if ($context.TokenCache -eq $null) {
Write-host -ForegroundColor Yellow "Please Login to Azure Account using Login-AzAccount and run the script."
exit
}
$subscriptions = Get-AzSubscription
if ($SubscriptionId -ne "All") {
$subscriptions = $subscriptions | Where-Object { $_.Id -eq $SubscriptionId }
if ($subscriptions.Count -eq 0) {
Write-host -ForegroundColor Yellow "Provided Subscription Id not found exiting."
exit
}
}
$scount = $subscriptions | Measure-Object
Write-Host "Subscriptions found $($scount.Count)"
if ($scount.Count -lt 1) {
exit
}
$InvalidItems = @()
$TotalRecCount = 0;
$ProgessActivity = "Processing Subscriptions";
$progressItr = 1;
$subscriptions | ForEach-Object {
$progressValue = $progressItr / $scount.Count
Select-AzSubscription -Subscription $_ | Out-Null
Write-Progress -Activity $ProgessActivity -Status "current subscription $_ $($progressValue.ToString('P')) Complete:" -PercentComplete ($progressValue * 100)
$progressItr = $progressItr + 1;
$subscription = $_
try {
$dnsZones = Get-AzDnsZone -ErrorAction Continue
}
catch {
Write-Host "Error retrieving DNS Zones for subscription $_"
return;
}
if ($ZoneName -ne "All") {
$dnsZones = $dnsZones | Where-Object { $_.Name -eq $ZoneName }
if ($dnsZones.Count -eq 0) {
Write-host -ForegroundColor Yellow "Provided ZoneName $ZoneName not found in Subscription $_."
return;
}
}
$dnsZones | ForEach-Object {
$allrecs = Get-AzDnsRecordSet -Zone $_
$sZoneName = $_.Name
$nsrecords = $allrecs | Where-Object { $_.RecordType -eq "NS" }
$records = $allrecs | Where-Object { ($_.RecordType -ne 'NS' ) -or ($_.Name -ne '@' ) }
$records | ForEach-Object {
$rec = $_
$Invalid = $false
$endsWith = "*$($rec.Name)"
$nsrecords | ForEach-Object { if ($endsWith -like "*.$($_.Name)") { $Invalid = $true } }
$TotalRecCount++
if ($Invalid) {
Write-Host -ForegroundColor Yellow "$($rec.Name) recordType $($rec.RecordType) zoneName $sZoneName subscription $subscription"
$hash = @{
Name = $rec.Name
RecordType = $rec.RecordType
ZoneName = $sZoneName
subscriptionId = $subscription
}
$item = New-Object PSObject -Property $hash
$InvalidItems += $item
}
else {
# Write-Host -ForegroundColor Green "$($rec.Name) recordType $($rec.RecordType) zoneName $ZoneName subscription $subscription "
}
}
}
}
Write-Progress -Activity $ProgessActivity -Completed
Write-Host "Total records processed $TotalRecCount"
$invalidMeasure = $InvalidItems | Measure-Object
Write-Host "Invalid Count $($invalidMeasure.Count)"
Write-Host "Invalid Records "
Write-Host "==============="
$InvalidItems | Format-Table